home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / Tools / TWILIGHT / TL_SOURC.E / THREADS / DEMO.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-17  |  5.3 KB  |  212 lines

  1. /*******************************************************************
  2.     DEMOMODUL für TwiLight
  3.     
  4.     THREADS 
  5.     
  6.     Delirium Arts 1996      
  7.     Tabsize=3
  8.     
  9.     Das Modul ist nicht besonders originell.
  10.     Es zeichnet zufällig Kreise, Rechtecke und Punkte auf den Schirm.
  11.     Die einzelnem Objekte werden unabhängig voneinander als Threads
  12.     gezeichnet.
  13.     Es werden abwechselnd je 10 Kreise, dann 10 Ellipsen gezeichnet.
  14. *******************************************************************/
  15.  
  16. #include <STDLIB.H>
  17. #include <VDI.H>
  18. #include <TOS.H>
  19. #include <STRING.H>
  20. #include <TWILIGHT.H>
  21. #include "DEMO.H"
  22.  
  23.  
  24. /* Modulkopf */
  25.  
  26. MODULE_INFO module_info=
  27.  {                                        /* Die Info-Struktur...            */
  28.             'XTLM',                    /* MAGIC                                */
  29.             0x0100,                    /* Versionsnummer vom Modul    */
  30.              0x198,                    /* benötigte ACC-Version        */
  31.             "THREAD-DEMO",            /* Modulname                        */
  32.             "Delirium Arts",        /* Name des Autors                 */
  33.             { 0x03FF, 0xFFC0, 0x0C00, 0x0030, 
  34.               0x1000, 0x0008, 0x2000, 0x0184, 
  35.               0x47FF, 0x0182, 0x4C01, 0x8302, 
  36.               0x898C, 0x8301, 0x8B8E, 0x8601, 
  37.               0x898C, 0x84F1, 0x8820, 0x8FB1, 
  38.               0x8471, 0x0E61, 0x8272, 0x00C1, 
  39.               0x8306, 0x0981, 0x8154, 0x0F01, 
  40.               0x4154, 0x0F02, 0x4154, 0x0F02, 
  41.               0x21FC, 0x0F84, 0x1800, 0x0008, 
  42.               0x0600, 0x0030, 0x0180, 0x00C0, 
  43.               0x0078, 0xFF00, 0x0009, 0x0000, 
  44.               0x000A, 0x0000, 0x000C, 0x0000
  45.             },
  46.             0,                         /* keinen Speicher */    
  47.             TL_CHANGESCREEN |        /* Schirminhalt wird verändert */
  48.             TL_CLEARSCREEN |        /* Schirm vor Start löschen durch TL */
  49.             TL_DARKENSCREEN |     /* Und auch dunkel drehen */
  50.             TL_NEEDVSYNCS |        /* bei jedem tl_check auch einen VSync machen */
  51.             TL_NEEDTHREADS,
  52.             
  53.             &module_xkonfig        /* Rest im Assemblerteil 'KONFIG.S' */
  54.  };
  55.  
  56. /********************
  57.   Globale Variablen
  58. *********************/
  59.  
  60.  
  61. TL_INFO *tl_struct;
  62.  
  63. /************************
  64.   Der Modul-Code
  65. ************************/
  66.  
  67. /* #include "multi_c.c" */
  68.  
  69. VOID cdecl module_main(TL_INFO *TL_STRUCT)
  70. {
  71.     tl_struct = TL_STRUCT;
  72.     handle = _tl_handle;                            /* VDI-Handle merken */
  73.     srand((UWORD)Random());                        /* PC-Zufallsgenerator initialisieren */
  74.     if (tl_threads_init(5,2000) < 0) ende();    /* Speicher für 5 Threads a 2000 Bytes anfordern */
  75.  
  76.     if (_max_colors == 2)                            /* Monochrom? */
  77.         vsf_interior(handle, FIS_PATTERN);    /* Füllmuster einstellen */
  78.     else
  79.         {
  80.         vsf_interior(handle, FIS_SOLID);
  81.         tl_set_col(farben, 16);                    /* ersten 16 Farben setzen */
  82.         }
  83.     vsm_color(handle, tl_fore_col);            /* Markerfarbe auf Fordergrundfarbe */
  84.  
  85.     tl_thread_install(kreise);
  86.     tl_thread_install(rechtecke);
  87.     tl_thread_install(marker); 
  88.  
  89.     while(!tl_check())                            /* Hauptschleife */
  90.         {
  91.         tl_threads_do();
  92.         }
  93.  
  94.     ende();
  95.     return;
  96. }
  97.  
  98. VOID ende(VOID)
  99. {
  100.     tl_threads_exit();
  101.     RETURN();
  102. }
  103.  
  104. /********************************************************************
  105.     Threads
  106. ********************************************************************/
  107.  
  108.  
  109. VOID rechtecke(VOID)
  110. {
  111.     SWORD x, y, breite, hoehe, color;
  112.     SWORD pxy[4];
  113.     
  114.     while(tl_thread_event() >= 0)
  115.         {
  116.         if (_max_colors == 2)                        /* monochrom? */
  117.             {
  118.             color=random(24)+1;                    /* Füllmuster auswählen */
  119.             vsf_style(handle, color);
  120.             }
  121.         else
  122.             {
  123.             color=random(16);
  124.             vsf_color(handle, color);
  125.             }
  126.         x=_vscr_x+random(_vscr_w);                /* Irgendwo auf den Bildschirm */
  127.         y=_vscr_y+random(_vscr_h);                /* (nur sichtbaren Bereich beachten) */
  128.         breite = random(50)+5;
  129.         hoehe = random(50)+5;
  130.         pxy[0]=x;
  131.         pxy[1]=y;
  132.         pxy[2]=x+breite-1;
  133.         pxy[3]=y+hoehe-1;
  134.         
  135.         v_bar(handle, pxy);
  136.         }
  137.     return;
  138. }
  139.  
  140. VOID marker(VOID)
  141. {
  142.     SWORD pxy[2];
  143.     
  144.     while(tl_thread_event() >= 0)
  145.         {
  146.         pxy[0] = _vscr_x+random(_vscr_w);                /* Irgendwo auf den Bildschirm */
  147.         pxy[1] = _vscr_y+random(_vscr_h);                /* (nur sichtbaren Bereich beachten) */
  148.         vsm_type(handle, random(6)+1);
  149.         v_pmarker(handle, 1, pxy);
  150.         }
  151.     return;
  152. }
  153.  
  154. VOID kreise(VOID)
  155. {
  156.     SWORD x,y, radius, color;
  157.     SWORD anzahl;
  158.  
  159.     anzahl=10;
  160.     
  161.     while(anzahl-- >0)
  162.         {
  163.         if (tl_thread_event() < 0) break;        /* wenn Thread beendet werden soll */
  164.         if (_max_colors == 2)                        /* monochrom? */
  165.             {
  166.             color=random(24)+1;                    /* Füllmuster auswählen */
  167.             vsf_style(handle, color);
  168.             }
  169.         else
  170.             {
  171.             color=random(16);
  172.             vsf_color(handle, color);
  173.             }
  174.         x=_vscr_x+random(_vscr_w);                /* Mittelpunkt irgendwo auf den Bildschirm */
  175.         y=_vscr_y+random(_vscr_h);                /* (nur sichtbaren Bereich beachten) */
  176.         radius = random(40)+5;
  177.         v_circle(handle, x,y,radius);            /* Kreis zeichnen */
  178.         }
  179.     if (anzahl<=0)
  180.         tl_thread_install(ellipsen);                /* neuen Thread mit Elipsen starten */
  181.     return;                                            /* Kreisthread beenden */
  182. }
  183.  
  184. VOID ellipsen(VOID)
  185. {
  186.     SWORD x,y, color;
  187.     SWORD anzahl;
  188.  
  189.     anzahl=10;
  190.     
  191.     while(anzahl-- >0)
  192.         {
  193.         if (tl_thread_event() < 0) break;        /* wenn Thread beendet werden soll */
  194.         if (_max_colors == 2)                        /* monochrom? */
  195.             {
  196.             color=random(24)+1;                    /* Füllmuster auswählen */
  197.             vsf_style(handle, color);
  198.             }
  199.         else
  200.             {
  201.             color=random(16);
  202.             vsf_color(handle, color);
  203.             }
  204.         x=_vscr_x+random(_vscr_w);                /* Mittelpunkt irgendwo auf den Bildschirm */
  205.         y=_vscr_y+random(_vscr_h);                /* (nur sichtbaren Bereich beachten) */
  206.         v_ellipse(handle, x, y, random(50)+2, random(50)+2);
  207.         }
  208.     if (anzahl<=0)
  209.         tl_thread_install(kreise);                    /* ab jetzt Kreise zeichnen */
  210.     return;
  211. }    
  212.